package org.management.base;

import org.management.config.shiro.manager.TokenManager;
import org.management.utils.DateUtils;
import org.management.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

/**
 * service基础方法实现类
 * @version:1.0
 * @Description: BaseServiceImpl
 * @author: jiangyan
 * @date: 2018年9月20日
 */
public abstract class BaseServiceImpl<T extends BaseEntity> implements BaseService<T> {
	
	private Class<T> entityClass;

	@Autowired
	private BaseDao<T> baseDao;

	@SuppressWarnings("unchecked")
	public BaseServiceImpl(){
		Type type = getClass().getGenericSuperclass();
		Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0];
		if (trueType instanceof  Class) {
			this.entityClass = (Class<T>) trueType;
		}
	}
	
	/**
	 * 默认字段  是否删除
	 */
	private final String IS_DELETE = "isDelete";
	
	/**
	 * 默认值 0 否 1 是
	 */
	private final String DELETE_VALUE = "0";


	/**
	 * 根据主键id 查询实体
	 */
	@Override
	public T selectByKey(Object key) {
		return baseDao.selectByPrimaryKey(key);
	}

	/**
	 * 根据实体数据查询实体信息
	 * @param entity 实体对象
	 * @return List<T>
	 */
	@Override
	public List<T> select(T entity) {
		return baseDao.select(entity);
	}

	/**
	 * 根据实体数据查询一条实体信息
	 * @param entity 实体对象
	 * @return T
	 */
	@Override
	public T selectOne(T entity) {
		return this.baseDao.selectOne(entity);
	}

	/**
	 * 查询所有未被删除的实体数据
	 * @return 实体数据集
	 */
	@Override
	public List<T> selectAll() {
		Example example = new Example(entityClass);
		Criteria criteria = example.createCriteria();
		criteria.andEqualTo(IS_DELETE, DELETE_VALUE);
		return baseDao.selectByExample(example);
	}

	/**
	 * 根据map查询实体数据  使用=进行匹配
	 * @param map 键值对数据
	 * @return 实体数据集
	 */
	@Override
	public List<T> selectByExample(Map<String, Object> map) {
		Example example = new Example(entityClass);
		Criteria criteria = example.createCriteria();
		criteria.andEqualTo(IS_DELETE, DELETE_VALUE);
		if (map != null && !map.isEmpty()) {
			criteria.andAllEqualTo(map);
		}
		return baseDao.selectByExample(example);
	}

	/**
	 * 根据example查询实体数据 可以自定义条件匹配
	 * @param  example 通用mapper 创建查询条件对象
	 * @return 实体数据集
	 */
	@Override
	public List<T> selectByExample(Example example) {
		return baseDao.selectByExample(example);
	}

	/**
	 * 新增实体数据
	 * @param entity 实体数据
	 * @return 是否保存成功  1成功 0失败
	 */
	@Override
	public int save(T entity) {
        setEntityInfo(entity);
		return baseDao.insertSelective(entity);
	}
	
	/**
	 * 设置实体的创建时间、创建人、等默认属性
	 * @param entity 实体数据
	 */
	protected void setEntityInfo(BaseEntity entity) {
		if (StringUtils.isBlank(entity.getId())) {
			entity.setId(null);
			entity.setCreateTime(DateUtils.getCurDateTime());
			entity.setIsDelete(false);
    		entity.setCreateUser(TokenManager.getLoginName());
		}
		entity.setLastUpdateTime(DateUtils.getCurDateTime());
		entity.setLastUpdateUser(TokenManager.getUserId());
	}

	/**
	 * 根据主键id删除实体
	 * @param key 主键id
	 * @return 是否删除成功  1成功 0失败
	 */
	@Override
	public int delete(Object key) {
		return baseDao.deleteByPrimaryKey(key);
	}

	/**
	 * 根据实体数据全部修改（包含空）
	 * @param entity 实体数据
	 * @return 是否修改成功  1成功 0失败
	 */
	@Override
	public int updateAll(T entity) {
		return baseDao.updateByPrimaryKey(entity);
	}

	/**
	 * 根据实体数据全部修改（不包含空）
	 * @param entity 实体数据
	 * @return 是否修改成功  1成功 0失败
	 */
	@Override
	public int updateNotNull(T entity) {
		return baseDao.updateByPrimaryKeySelective(entity);
	}

	/**
	 * 根据实体数据查询合计数
	 * @param entity 实体数据
	 * @return 查询条数
	 */
	@Override
	public int selectCount(T entity) {
		return baseDao.selectCount(entity);
	}

}
